using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class JogoManagerScript : MonoBehaviour {

	private List<Jogador> jogadores = new List<Jogador>();
	
	public Dictionary<string, GameObject> territorios = new Dictionary<string, GameObject>();
	
	private StatusJogo statusJogo;
	
	private List<GameObject> territoriosDistribuidos;

	public Jogador jogadorDaVez;
	
	private ObjetivoManagerScript objetivoManagerScript;	
	
	private BaralhoScript baralhoTerritorios;

	void Start () {
		
		// Carrega os Terrotorios baseado na TAG Territorio.
		foreach (GameObject territorio in GameObject.FindGameObjectsWithTag("Territorio")) {
		
			this.territorios.Add(territorio.name.ToString(), territorio);
		}	
		
		Debug.Log(territorios.Count + " territorios carregados");
		
		
		Debug.Log("Jogo iniciado");
		
		// Inicia o jogo distribuindo os exercitos.
		statusJogo = StatusJogo.DISTRUBIUNDO_TERRITORIOS;
		
		// Nenhum territorio distribuido 
		this.territoriosDistribuidos = new List<GameObject>();
		
		Debug.Log("Sorteando os objetivos.");
		
		// Sorteia os Objetivos
		this.objetivoManagerScript = new ObjetivoManagerScript();
		List<ObjetivoScript> objetivoRandom = this.objetivoManagerScript.sortearObjetivos(SceneProperties.QuantidadeDeJogadores); 
		
		Debug.Log("Objetivos Sorteados.");
		
		// TODO: Remover esta variável
		// Index para auxiliar na criação do nome do jogador;
		int indexAuxiliar = 1;
		
		Debug.Log("Atribuindo objetivos os jogadores.");
		
		// Cria os Jogadores e Atribui seus objetivos.
		foreach (ObjetivoScript objetivo in objetivoRandom) {
			
			Jogador jogador = new Jogador("jogador" + indexAuxiliar.ToString(), objetivo);
			this.jogadores.Add(jogador);
			
			indexAuxiliar++;
		}
		
		Debug.Log("Jogadores receberam seus objetivos.");
		
		this.jogadorDaVez = this.jogadores[0];
		
	}
	
	void OnGUI () {
		
		// Lista o nome dos jogadores
		int posicaoInicialW = 10;
		int largura = 100;
		
		foreach(Jogador jogador in this.jogadores) {
		
			string nome = jogador.Nome;
			
			if (this.jogadorDaVez == jogador) {
				nome = ">>>" + nome;
			}	
			
			GUI.Label(new Rect(posicaoInicialW, 10, largura, 30), nome + " - " + jogador.Territorios.Count);
			
			posicaoInicialW += largura;
		}
		
	}	

	void Update () {
		
		// Verifica o Status do Jogo.
		switch (this.statusJogo) {
			
			// Fase inicial do Jogo onde todos os territorios são escolhidos.
			case StatusJogo.DISTRUBIUNDO_TERRITORIOS:
				
				distribuirExercitos();
			
			break;
			
			// Calcula a maioria ou totalidade dos territorios.
			case StatusJogo.CALCULANDO_EXERCITOS:
			
				calcularExercitos ();	

			break;
			
		}	
		
	}
	
	void distribuirExercitos() {
		
		Debug.Log("Distribuindo Exercitos");
	
		if (Input.GetKeyDown(KeyCode.Mouse0)) {
	
			RaycastHit hit;
			
			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
			
			if (Physics.Raycast (ray, out hit)){
		
				GameObject territorio = hit.collider.gameObject;
				
				// Verifica se um Territorio foi clicado
				if(territorio.tag == "Territorio") {
					
					// Se o territorio ainda não foi distribuido
					if (!this.territoriosDistribuidos.Contains(territorio)) {
						
						// Coloca um exercito no territorio
						((TerritorioManagerScript) gameObject.GetComponent("TerritorioManagerScript")).addExercito(territorio, 1);
						
						// Sinaliza o territorio como distribuido
						this.territoriosDistribuidos.Add(territorio);
						
						// Adiciona o territorio na lista de territorios do Jogador da Vez.
						this.jogadorDaVez.Territorios.Add(territorio);
						
						proximoJogador();
						
					}
					
					// Verifica se ainda existe territorio para distribuir.
					if (this.territoriosDistribuidos.Count == territorios.Count) {
						
						// Nenhum territorio distribuido 
						this.territoriosDistribuidos = new List<GameObject>();
						this.statusJogo = StatusJogo.CALCULANDO_EXERCITOS;
					}	
					
					Debug.Log("Qtde Territorios distribuidos: " + this.territoriosDistribuidos.Count);
					
				}
			}
		}

	}	

	void calcularExercitos ()
	{
		Dictionary<Jogador, int> mundo = new Dictionary<Jogador, int>();
		Dictionary<Continente, Jogador> maiorias = new Dictionary<Continente, Jogador>();
		Dictionary<Continente, Jogador> totalidades = new Dictionary<Continente, Jogador>();
		
		foreach (Jogador jogador in this.jogadores) {
		
			mundo.Add(jogador, (jogador.Territorios.Count) / 2 );
		
			foreach (string i in Enum.GetNames(typeof(Continente))) {
			
				Continente continente = (Continente) Enum.Parse(typeof(Continente), i);
			
				bool maioria = ((TerritorioManagerScript) gameObject.GetComponent("TerritorioManagerScript")).possuiMaioria(jogador, continente);
				if (maioria) {
					maiorias.Add(continente, jogador);
				}
			
				bool totalidade = ((TerritorioManagerScript) gameObject.GetComponent("TerritorioManagerScript")).possuiTotalidade(jogador, continente);
				if (totalidade) {
					totalidades.Add(continente, jogador);
				}	
			}
		}
	}	
	
	
	public void proximoJogador() {
		
		int posicaoJogadorAtual = jogadores.IndexOf(this.jogadorDaVez);

		if (posicaoJogadorAtual < SceneProperties.QuantidadeDeJogadores - 1) {
			
			this.jogadorDaVez = this.jogadores[++posicaoJogadorAtual];

		} else {
			
			this.jogadorDaVez = this.jogadores[0];
		}	
	}	
	
	public void checarClique() {
	
//		RaycastHit hit;
		
		//reconhece clique do mouse - botão direito
//		if (Input.GetKeyDown(KeyCode.Mouse0)) {
//		
//			Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
//			
//			Debug.Log (ray);
//			
//			//identifica posição onde foi clicado
//			if (Physics.Raycast (ray, out hit)){
//			
//				// Verifica se um Territorio foi clicado
//				if(hit.collider.gameObject.tag == "Territorio") {
//					
//					Debug.Log("Territorio ");
//
//					TerritorioManagerScript territorioManagerScript = (TerritorioManagerScript) gameObject.GetComponent("TerritorioManagerScript");
//					
//					territorioManagerScript.addExercito(hit.collider.gameObject, 1);
//
//				}
//			}
//		}
		
	}	
}
